package com.whxd.system.user.web;

import java.io.IOException;
import java.net.URLDecoder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.swing.text.Position;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.whxd.framework.common.dto.PageParam;
import com.whxd.framework.common.dto.PageResult;
import com.whxd.framework.common.dto.ReturnObject;
import com.whxd.framework.common.web.ContextUtils;
import com.whxd.framework.security.FrameworkUserDetails;
import com.whxd.framework.utils.BeanMapper;
import com.whxd.system.role.entity.Role;
import com.whxd.system.user.entity.User;
import com.whxd.system.user.service.UserService;

/**
 * 用户管理控制类
 * 
 * @author 张世鹏
 * @since 2013-6-18
 */
@Controller
@RequestMapping("/system/user")
public class UserCtrl {

	private final static Logger log = LoggerFactory.getLogger(UserCtrl.class);

	@Autowired
	private UserService userService;

	/**
	 * 根据id获取用户
	 * 
	 * @author 张世鹏
	 * @since 2013-7-30
	 * @param uid
	 * @return
	 */
	@RequestMapping("/{uid}")
	@ResponseBody
	public UserDto findById(@PathVariable Long uid) {
		UserDto dto = BeanMapper.map(userService.findOne(uid), UserDto.class);
		return dto;
	}

	/**
	 * 获取当前登录用户信息
	 * 
	 * @author 张世鹏
	 * @since 2013-7-30
	 * @return
	 */
	@RequestMapping("/me")
	@ResponseBody
	public UserDto findMe() {
		Long myUserId = ContextUtils.getCurrentSecurityUser().getId();
		User user = userService.findOne(myUserId);
		UserDto dto = BeanMapper.map(user, UserDto.class);
		return dto;
	}

//	/**
//	 * 查询用户datagrid表格组件数据
//	 * 
//	 * @author 张世鹏
//	 * @since 2013-7-30
//	 * @param page
//	 * @param condition
//	 * @param request
//	 * @return
//	 * @throws JsonParseException
//	 * @throws JsonMappingException
//	 * @throws IOException
//	 */
//	@RequestMapping("/datagrid")
//	@ResponseBody
////	@RolesAllowed(AuthorityDefine.AUTH_SYS_USER_MANAGE)
//	public PageResult<UserGridDto> datagrid(PageParam page, UserCondition condition, HttpServletRequest request)
//			throws JsonParseException, JsonMappingException, IOException {
//		/*
//		 * 如果结束日期选择了2013-06-01，那么正常应该是2013-06-01 23:59:59， 但实际上是2013-06-01
//		 * 00:00:00, 所以应该将时间加一天就可以了
//		 */
//		if (condition.getCreatedTimeEnd() != null) {
//			Calendar cal = Calendar.getInstance();
//			cal.setTime(condition.getCreatedTimeEnd());
//			cal.set(Calendar.DATE, cal.get(Calendar.DATE) + 1);
//			condition.setCreatedTimeEnd(cal.getTime());
//		}
//		PageResult<UserGridDto> result = userService.findByCondition(page, condition);
//		return result;
//	}

//	/**
//	 * 查询用户datagrid表格组件数据
//	 * 
//	 * @author 张世鹏
//	 * @since 2013-7-30
//	 * @param page
//	 * @param condition
//	 * @param request
//	 * @return
//	 * @throws JsonParseException
//	 * @throws JsonMappingException
//	 * @throws IOException
//	 */
//	@RequestMapping("/userSelectDatagrid")
//	@ResponseBody
//	@RolesAllowed(AuthorityDefine.ROLE_USER)
//	public PageResult userSelectDatagrid(PageParam page, UserSelectCondition condition, HttpServletRequest request)
//			throws JsonParseException, JsonMappingException, IOException {
//		PageResult<UserGridDto> result = userService.findByUserSelectCondition(page, condition);
//		return result;
//	}
//
//	/**
//	 * combogrid组件模糊查询用户数据（用户名和姓名）
//	 * 
//	 * @author 张世鹏
//	 * @since 2013-7-30
//	 * @param page
//	 * @param q
//	 * @return
//	 */
//	@RequestMapping("/combogrid")
//	@ResponseBody
//	@RolesAllowed(AuthorityDefine.ROLE_USER)
//	public PageResult<UserGridDto> combogrid(String q) {
//		//为了解决分页时不能正确的转译combo中的数据，所以直接不分页了，显示全部
//		PageResult<UserGridDto> result = userService.findCombo(q);
//		return result;
//	}
//	
//
//	/**
//	 * 自动补全空间方法
//	 * 
//	 * @author 张世鹏
//	 * @since 2013-7-30
//	 * @param page
//	 * @param q
//	 * @return
//	 */
//	@RequestMapping("/autocomplete")
//	@ResponseBody
//	@RolesAllowed(AuthorityDefine.ROLE_USER)
//	public List<AutoCompleteDto> autocomplete(String term) {
//		List<AutoCompleteDto> result = userService.autoComplete(term);
//		return result;
//	}
//
//	/**
//	 * 跳转到编辑页面
//	 * 
//	 * @author 张世鹏
//	 * @since 2013-7-30
//	 * @param id
//	 * @return
//	 */
//	@RequestMapping("/toEdit")
//	@RolesAllowed(AuthorityDefine.AUTH_SYS_USER_MANAGE)
//	public ModelAndView toEdit(Long id) {
//		User user = userService.findById(id);
//		UserDto dto = BeanMapper.map(user, UserDto.class);
//		if (user.getOrganization() != null) {
//			dto.setOrganizationId(user.getOrganization().getId());
//		}
//
//		String positionIds = "";
//		String positionNames = "";
//		List<Position> positions = user.getPositions();
//		for (Position position : positions) {
//			positionIds += position.getId() + ",";
//			positionNames += position.getName() + ",";
//		}
//		positionIds = StringUtils.removeEnd(positionIds, ",");
//		positionNames = StringUtils.removeEnd(positionNames, ",");
//
//		dto.setPositionIds(positionIds);
//		dto.setPositionNames(positionNames);
//
//		dto.setPassword("");
//		return new ModelAndView("/pages/system/user/edit", "user", dto);
//	}
//
//	/**
//	 * 跳转到新建页面用户
//	 * 
//	 * @author 张世鹏
//	 * @since 2013-7-30
//	 * @param pid
//	 * @return
//	 */
//	@RequestMapping("/toAdd")
//	@RolesAllowed(AuthorityDefine.AUTH_SYS_USER_MANAGE)
//	public ModelAndView toAdd(Long pid) {
//		return new ModelAndView("/pages/system/user/add");
//	}
//
//	/**
//	 * 跳转到用户授权页面
//	 * 
//	 * @author 张世鹏
//	 * @since 2013-7-30
//	 * @param uid
//	 * @return
//	 */
//	@RequestMapping("/toGrant")
//	@RolesAllowed(AuthorityDefine.AUTH_SYS_USER_MANAGE)
//	public ModelAndView toGrant(Long uid) {
//		User user = userService.findById(uid);
//		List<Role> roles = user.getRoles();
//		String roleIds = "";
//		for (Role role : roles) {
//			roleIds += role.getId() + ",";
//		}
//		if (roleIds.endsWith(",")) {
//			roleIds = roleIds.substring(0, roleIds.length() - 1);
//		}
//		UserDto dto = new UserDto();
//		dto.setId(uid);
//		dto.setRoleIds(roleIds);
//		return new ModelAndView("/pages/system/user/grantRole", "user", dto);
//	}
//
//	/**
//	 * 删除用户（批量）
//	 * 
//	 * @author 张世鹏
//	 * @since 2013-7-30
//	 * @param ids
//	 *            要删除的用户id集合，中间','分割
//	 * @return
//	 * @throws JsonParseException
//	 * @throws JsonMappingException
//	 * @throws IOException
//	 */
//	@RequestMapping("/delete")
//	@ResponseBody
//	@RolesAllowed(AuthorityDefine.AUTH_SYS_USER_MANAGE)
//	public ReturnObject delete(String ids) throws JsonParseException, JsonMappingException, IOException {
//		ReturnObject result = new ReturnObject();
//		try {
//			userService.deleteBatch(ids);
//			result.setSuccess(true);
//			result.setMsg("删除成功");
//		} catch (Exception e) {
//			log.error("删除失败", e);
//			result.setMsg("删除失败：" + e.getMessage());
//		}
//		return result;
//	}
//
//	/**
//	 * 创建新用户
//	 * 
//	 * @author 张世鹏
//	 * @since 2013-7-30
//	 * @param user
//	 * @return
//	 */
//	@RequestMapping("/add")
//	@ResponseBody
//	@RolesAllowed(AuthorityDefine.AUTH_SYS_USER_MANAGE)
//	public ReturnObject add(UserDto user) {
//		ReturnObject ro = new ReturnObject();
//		userService.add(user);
//		ro.setMsg("保存成功");
//		ro.setSuccess(true);
//		return ro;
//	}
//
//	/**
//	 * 修改用户信息
//	 * 
//	 * @author 张世鹏
//	 * @since 2013-7-30
//	 * @param user
//	 * @return
//	 */
//	@RequestMapping("/edit")
//	@ResponseBody
//	@RolesAllowed(AuthorityDefine.AUTH_SYS_USER_MANAGE)
//	public ReturnObject edit(UserDto user) {
//		ReturnObject ro = new ReturnObject();
//		userService.update(user);
//		ro.setMsg("保存成功");
//		ro.setSuccess(true);
//		return ro;
//	}
//
//	/**
//	 * 授予用户角色
//	 * 
//	 * @author 张世鹏
//	 * @since 2013-7-30
//	 * @param dto
//	 * @return
//	 */
//	@RequestMapping("/grantRole")
//	@ResponseBody
//	@RolesAllowed(AuthorityDefine.AUTH_SYS_USER_GRANT)
//	public ReturnObject grantRole(UserDto dto) {
//		ReturnObject ro = new ReturnObject();
//		try {
//			userService.grantRoles(dto);
//			ro.setMsg("授权成功");
//			ro.setSuccess(true);
//		} catch (Exception e) {
//			log.error(e.getMessage(), e);
//			ro.setMsg("授权失败:" + e.getMessage());
//		}
//		return ro;
//	}
//
//	/**
//	 * 此方法用于用户组件 queryUrl方法
//	 * 
//	 * @author 王泽鑫
//	 * @since 2014-1-14
//	 * @param username
//	 * @return
//	 */
//	@RequestMapping("/findByUsernames")
//	@ResponseBody
//	@RolesAllowed(AuthorityDefine.ROLE_USER)
//	public List<UserDto> findByUsernames(String username) {
//		List<UserDto> result = userService.findByUsernames(username);
//		return result;
//	}
//
//	@RequestMapping("/findByUsername")
//	@ResponseBody
//	@RolesAllowed(AuthorityDefine.ROLE_USER)
//	public UserDto findByUsername(String username) {
//		UserDto dto = userService.findUserDtoByUserName(username);
//
//		return dto;
//	}
//
//	// @RequestMapping("/logonUsers")
//	// @ResponseBody
//	// @RolesAllowed(AuthorityDefine.AUTH_SYS_USER_MANAGE)
//	// public List<String> logonUsers(){
//	// List<Object> principals = sessionRegistry.getAllPrincipals();
//	// List<String> result = new ArrayList<String>();
//	// for (int i = 0;i < principals.size();i++){
//	// List<SessionInformation> sis =
//	// sessionRegistry.getAllSessions(principals.get(i),false);
//	// result.add(principals.get(i).toString());
//	// System.out.println("Adding entry: " + principals.get(i).toString() +
//	// ", sessions: " + sis.size());
//	// }
//	//
//	// return result;
//	// }
//
//	@RequestMapping("/exportExcel")
//	@RolesAllowed(AuthorityDefine.AUTH_SYS_USER_MANAGE)
//	public void exportExcel(UserCondition condition, String columnDef, HttpServletResponse response) {
//
//		try {
//			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_hh:mm:ss");
//			String fileName = "Users_" + sdf.format(new Date()) + ".xls";
//			response.addHeader("Content-Disposition", "attachment;filename=" + fileName);
//			response.setContentType("application/octet-stream");
//
//			// 准备数据
//			PageResult<UserGridDto> dtos = userService.findByCondition(new PageParam(1, 65535), condition);
//
//			columnDef = URLDecoder.decode(columnDef);// 反编译字段
//
//			ExportExcel.datagridExport(response.getOutputStream(), columnDef, dtos.getRows());
//
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//	}
//	
//	
//	/**
//	 * 返回所有用户
//	 * 
//	 * @author 刘伟
//	 * @since 2014-4-22
//	 * @return
//	 */
//	@RequestMapping("/findAllUser")
//	@ResponseBody
//	@RolesAllowed(AuthorityDefine.ROLE_USER)
//	public PageResult<User> findAllUser(){
//		List<User> allUserList = userService.findAllUser();
//		PageResult<User> pageResult = new PageResult<User>();
//		
//		List<User> filterUserList = new ArrayList<User>();
//		for(int i=0;i<allUserList.size();i++){
//			User user = new User();
//			user.setFullname(allUserList.get(i).getFullname());
//			user.setUsername(allUserList.get(i).getUsername());
//			user.setId(allUserList.get(i).getId());
//			filterUserList.add(user);
//		}
//		
//		pageResult.setRows(filterUserList);
//		return pageResult;
//	}
}
